#ifndef HCCL_API_H
#define HCCL_API_H

#include <cstdint>
#include <string>

namespace hccl {
    using FdHandle = void *;

    enum class HcclResult {
        SUCCESS = 0, // 成功
        E_PARA = 1, // 参数错误
    };

    enum class CommProtocol {
        RESERVED = -1, // 保留协议类型
        HCCS = 0, // HCCS协议
        TCP = 1, // 标准TCP协议
        ROCE = 2, // RDMA over Converged Ethernet
        UB_CTP = 3, // 华为统一总线UB_CTP
        UB_TP = 4, // 华为统一总线UB_TP
        PCIE = 5, // PCIE协议
        SIO = 6, // SIO协议
    };

    enum class CommAddrType {
        RESERVED = -1, // 保留地址类型
        IP_V4 = 0, // IPv4地址类型
        IP_V6 = 1, // IPv6地址类型
        ID = 2, // ID地址类型
    };

    struct CommAddr {
        CommAddrType type; // 通信地址类别
        union {
            uint32_t id; // 标识
            struct in_addr addr; // IPv4地址结构
            struct in6_addr addr6; // IPv6地址结构
        };

        CommAddr() : type(CommAddrType::RESERVED), id(0) {
        }
    };

    struct EndPoint {
        CommProtocol protocol; // 通信协议
        CommAddr commAddr; // 通信地址

        EndPoint() : protocol(CommProtocol::RESERVED) {
        }
    };

    enum class HcclMemType {
        DEVICE, // 设备侧内存（如NPU等）
        HOST, // 主机侧内存
        NUM // 内存类型数量
    };

    struct HcclMem {
        HcclMemType type; // 内存物理位置类型
        void *addr; // 内存虚拟地址
        uint64_t size; // 内存区域字节数

        HcclMem() : type(HcclMemType::HOST), addr(nullptr), size(0) {
        }
    };

    struct HcommBuf {
        void *addr;
        uint64_t len;
    };
} // namespace hccl

#endif // HCCL_API_H
